/**
 * 图片编辑配置工具类
 * 统一管理不同场景下的图片裁剪配置
 */

// 基础配置
const BASE_CONFIG = {
  dialogWidth: '800px',
  cropperHeight: 400,
  maxFileSize: 5,
  outputType: 'png',
  fixedBox: false
}

// 不同场景的图片配置
export const IMAGE_CONFIGS = {
  // Banner图片配置
  banner: {
    ...BASE_CONFIG,
    autoCropWidth: 750,
    autoCropHeight: 400,
    cropperHeight: 450,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 750x400，文件大小不超过 5MB',
    placeholderText: '请上传Banner图片，建议尺寸 750x400 像素',
    cropperTitle: 'Banner图片裁剪'
  },
  
  // 园区图片配置
  park: {
    ...BASE_CONFIG,
    autoCropWidth: 375,
    autoCropHeight: 210,
    cropperHeight: 450,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 375x210，文件大小不超过 5MB',
    placeholderText: '请上传园区缩略图，建议尺寸 375x210 像素',
    cropperTitle: '园区图片裁剪'
  },
  
  // 仓库图片配置
  warehouse: {
    ...BASE_CONFIG,
    autoCropWidth: 640,
    autoCropHeight: 480,
    cropperHeight: 400,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 640x480，文件大小不超过 5MB',
    placeholderText: '请上传仓库缩略图，建议尺寸 640x480 像素',
    cropperTitle: '仓库图片裁剪'
  },
  
  // 资讯图片配置
  news: {
    ...BASE_CONFIG,
    autoCropWidth: 200,
    autoCropHeight: 300,
    cropperHeight: 400,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 200x300，文件大小不超过 5MB',
    placeholderText: '请上传资讯缩略图，建议尺寸 200x300 像素',
    cropperTitle: '资讯图片裁剪'
  },
  
  // 小图标配置（64x64）
  icon: {
    ...BASE_CONFIG,
    autoCropWidth: 64,
    autoCropHeight: 64,
    cropperHeight: 400,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 64x64，文件大小不超过 5MB',
    placeholderText: '请上传图标，建议尺寸 64x64 像素',
    cropperTitle: '图标裁剪'
  },
  
  // 仓库类型图标
  warehouseType: {
    ...BASE_CONFIG,
    autoCropWidth: 64,
    autoCropHeight: 64,
    cropperHeight: 400,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 64x64，文件大小不超过 5MB',
    placeholderText: '请上传类型图片，建议尺寸 64x64 像素',
    cropperTitle: '仓库类型图片裁剪'
  },
  
  // 园区配置图标
  parkConfig: {
    ...BASE_CONFIG,
    autoCropWidth: 64,
    autoCropHeight: 64,
    cropperHeight: 400,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 64x64，文件大小不超过 5MB',
    placeholderText: '请上传配置图片，建议尺寸 64x64 像素',
    cropperTitle: '园区配置图片裁剪'
  },
  
  // 园区服务图标
  parkService: {
    ...BASE_CONFIG,
    autoCropWidth: 64,
    autoCropHeight: 64,
    cropperHeight: 400,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 64x64，文件大小不超过 5MB',
    placeholderText: '请上传服务图片，建议尺寸 64x64 像素',
    cropperTitle: '园区服务图片裁剪'
  },
  
  // 园区标签图标
  parkTag: {
    ...BASE_CONFIG,
    autoCropWidth: 64,
    autoCropHeight: 64,
    cropperHeight: 400,
    uploadTip: '支持 JPG、PNG 格式，建议尺寸 64x64，文件大小不超过 5MB',
    placeholderText: '请上传标签图片，建议尺寸 64x64 像素',
    cropperTitle: '园区标签图片裁剪'
  }
}

/**
 * 获取图片配置
 * @param {string} type 配置类型
 * @param {object} customConfig 自定义配置，会覆盖默认配置
 * @returns {object} 图片配置对象
 */
export function getImageConfig(type, customConfig = {}) {
  const baseConfig = IMAGE_CONFIGS[type] || IMAGE_CONFIGS.icon
  
  return {
    ...baseConfig,
    ...customConfig,
    cropperConfig: {
      autoCrop: true,
      autoCropWidth: baseConfig.autoCropWidth,
      autoCropHeight: baseConfig.autoCropHeight,
      fixedBox: baseConfig.fixedBox,
      outputType: baseConfig.outputType
    }
  }
}

/**
 * 获取裁剪器配置
 * @param {string} type 配置类型
 * @param {object} customConfig 自定义配置
 * @returns {object} 裁剪器配置对象
 */
export function getCropperConfig(type, customConfig = {}) {
  const config = getImageConfig(type, customConfig)
  return config.cropperConfig
}

/**
 * 验证图片文件
 * @param {File} file 文件对象
 * @param {number} maxSize 最大文件大小（MB）
 * @returns {boolean} 是否通过验证
 */
export function validateImageFile(file, maxSize = 5) {
  // 检查文件类型
  if (!file.type.startsWith('image/')) {
    return { valid: false, message: '文件格式错误，请上传图片类型文件' }
  }
  
  // 检查文件大小
  const fileSizeMB = file.size / 1024 / 1024
  if (fileSizeMB > maxSize) {
    return { valid: false, message: `图片大小不能超过 ${maxSize}MB` }
  }
  
  return { valid: true }
}

/**
 * 格式化文件大小
 * @param {number} bytes 字节数
 * @returns {string} 格式化后的文件大小
 */
export function formatFileSize(bytes) {
  if (bytes === 0) return '0 B'
  
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 获取图片的宽高信息
 * @param {string} src 图片地址
 * @returns {Promise<object>} 图片宽高信息
 */
export function getImageDimensions(src) {
  return new Promise((resolve, reject) => {
    const img = new Image()
    img.onload = () => {
      resolve({
        width: img.width,
        height: img.height
      })
    }
    img.onerror = reject
    img.src = src
  })
}

export default {
  IMAGE_CONFIGS,
  getImageConfig,
  getCropperConfig,
  validateImageFile,
  formatFileSize,
  getImageDimensions
} 